home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / glibc108.zip / glibc108 / malloc / vm-limit.c < prev   
C/C++ Source or Header  |  1993-10-14  |  4KB  |  136 lines

  1. /* Functions for memory limit warnings.
  2.    Copyright (C) 1990, 1992 Free Software Foundation, Inc.
  3.  
  4.  
  5. This file is part of the GNU C Library.  Its master source is NOT part of
  6. the C library, however.  The master source lives in /gd/gnu/lib.
  7.  
  8. The GNU C Library is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU Library General Public License as
  10. published by the Free Software Foundation; either version 2 of the
  11. License, or (at your option) any later version.
  12.  
  13. The GNU C Library is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. Library General Public License for more details.
  17.  
  18. You should have received a copy of the GNU Library General Public
  19. License along with the GNU C Library; see the file COPYING.LIB.  If
  20. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  21. Cambridge, MA 02139, USA.  */
  22.  
  23. #ifdef emacs
  24. #include <config.h>
  25. #include "lisp.h"
  26. #endif
  27.  
  28. #ifndef emacs
  29. #include <stddef.h>
  30. typedef size_t SIZE;
  31. typedef void *POINTER;
  32. #define EXCEEDS_LISP_PTR(x) 0
  33. #endif
  34.  
  35. #include "mem-limits.h"
  36.  
  37. /*
  38.   Level number of warnings already issued.
  39.   0 -- no warnings issued.
  40.   1 -- 75% warning already issued.
  41.   2 -- 85% warning already issued.
  42.   3 -- 95% warning issued; keep warning frequently.
  43. */
  44. static int warnlevel;
  45.  
  46. /* Function to call to issue a warning;
  47.    0 means don't issue them.  */
  48. static void (*warn_function) ();
  49.  
  50. /* Get more memory space, complaining if we're near the end. */
  51.  
  52. static void
  53. check_memory_limits ()
  54. {
  55.   extern POINTER (*__morecore) ();
  56.  
  57.   register POINTER cp;
  58.   unsigned long five_percent;
  59.   unsigned long data_size;
  60.  
  61.   if (lim_data == 0)
  62.     get_lim_data ();
  63.   five_percent = lim_data / 20;
  64.  
  65.   /* Find current end of memory and issue warning if getting near max */
  66.   cp = (char *) (*__morecore) (0);
  67.   data_size = (char *) cp - (char *) data_space_start;
  68.  
  69.   if (warn_function)
  70.     switch (warnlevel)
  71.       {
  72.       case 0: 
  73.     if (data_size > five_percent * 15)
  74.       {
  75.         warnlevel++;
  76.         (*warn_function) ("Warning: past 75% of memory limit");
  77.       }
  78.     break;
  79.  
  80.       case 1: 
  81.     if (data_size > five_percent * 17)
  82.       {
  83.         warnlevel++;
  84.         (*warn_function) ("Warning: past 85% of memory limit");
  85.       }
  86.     break;
  87.  
  88.       case 2: 
  89.     if (data_size > five_percent * 19)
  90.       {
  91.         warnlevel++;
  92.         (*warn_function) ("Warning: past 95% of memory limit");
  93.       }
  94.     break;
  95.  
  96.       default:
  97.     (*warn_function) ("Warning: past acceptable memory limits");
  98.     break;
  99.       }
  100.  
  101.   /* If we go down below 70% full, issue another 75% warning
  102.      when we go up again.  */
  103.   if (data_size < five_percent * 14)
  104.     warnlevel = 0;
  105.   /* If we go down below 80% full, issue another 85% warning
  106.      when we go up again.  */
  107.   else if (warnlevel > 1 && data_size < five_percent * 16)
  108.     warnlevel = 1;
  109.   /* If we go down below 90% full, issue another 95% warning
  110.      when we go up again.  */
  111.   else if (warnlevel > 2 && data_size < five_percent * 18)
  112.     warnlevel = 2;
  113.  
  114.   if (EXCEEDS_LISP_PTR (cp))
  115.     (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
  116. }
  117.  
  118. /* Cause reinitialization based on job parameters;
  119.    also declare where the end of pure storage is. */
  120.  
  121. void
  122. memory_warnings (start, warnfun)
  123.      POINTER start;
  124.      void (*warnfun) ();
  125. {
  126.   extern void (* __after_morecore_hook) ();     /* From gmalloc.c */
  127.  
  128.   if (start)
  129.     data_space_start = start;
  130.   else
  131.     data_space_start = start_of_data ();
  132.  
  133.   warn_function = warnfun;
  134.   __after_morecore_hook = check_memory_limits;
  135. }
  136.